home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows (5th Edition) / Programming Windows, 5th ed. - Companion CD (097-0002183)(1999).iso / Chap15 / DibHeads / DibHeads.c next >
Encoding:
C/C++ Source or Header  |  1998-10-09  |  13.1 KB  |  356 lines

  1. /*-----------------------------------------------
  2.    DIBHEADS.C -- Displays DIB Header Information
  3.                  (c) Charles Petzold, 1998
  4.   -----------------------------------------------*/
  5.  
  6. #define WINVER 0x0500
  7. #include <windows.h>
  8. #include "resource.h"
  9.  
  10. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  11.  
  12. TCHAR szAppName[] = TEXT ("DibHeads") ;
  13.  
  14. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  15.                     PSTR szCmdLine, int iCmdShow)
  16. {
  17.      HACCEL   hAccel ;
  18.      HWND     hwnd ;
  19.      MSG      msg ;
  20.      WNDCLASS wndclass ;
  21.  
  22.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  23.      wndclass.lpfnWndProc   = WndProc ;
  24.      wndclass.cbClsExtra    = 0 ;
  25.      wndclass.cbWndExtra    = 0 ;
  26.      wndclass.hInstance     = hInstance ;
  27.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  28.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  29.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  30.      wndclass.lpszMenuName  = szAppName ;
  31.      wndclass.lpszClassName = szAppName ;
  32.  
  33.      if (!RegisterClass (&wndclass))
  34.      {
  35.           MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
  36.                       szAppName, MB_ICONERROR) ;
  37.           return 0 ;
  38.      }
  39.      
  40.      hwnd = CreateWindow (szAppName, TEXT ("DIB Headers"),
  41.                           WS_OVERLAPPEDWINDOW,
  42.                           CW_USEDEFAULT, CW_USEDEFAULT,
  43.                           CW_USEDEFAULT, CW_USEDEFAULT, 
  44.                           NULL, NULL, hInstance, NULL) ;
  45.      
  46.      ShowWindow (hwnd, iCmdShow) ;
  47.      UpdateWindow (hwnd) ;
  48.  
  49.      hAccel = LoadAccelerators (hInstance, szAppName) ;
  50.      
  51.      while (GetMessage (&msg, NULL, 0, 0))
  52.      {
  53.           if (!TranslateAccelerator (hwnd, hAccel, &msg))
  54.           {
  55.                TranslateMessage (&msg) ;
  56.                DispatchMessage (&msg) ;
  57.           }
  58.      }
  59.      return msg.wParam ;
  60. }
  61.  
  62. void Printf (HWND hwnd, TCHAR * szFormat, ...)
  63. {
  64.      TCHAR   szBuffer [1024] ;
  65.      va_list pArgList ;
  66.  
  67.      va_start (pArgList, szFormat) ;
  68.      wvsprintf (szBuffer, szFormat, pArgList) ;
  69.      va_end (pArgList) ;
  70.  
  71.      SendMessage (hwnd, EM_SETSEL, (WPARAM) -1, (LPARAM) -1) ;
  72.      SendMessage (hwnd, EM_REPLACESEL, FALSE, (LPARAM) szBuffer) ;
  73.      SendMessage (hwnd, EM_SCROLLCARET, 0, 0) ;
  74. }
  75.  
  76. void DisplayDibHeaders (HWND hwnd, TCHAR * szFileName)
  77. {
  78.      static TCHAR     * szInfoName [] = { TEXT ("BITMAPCOREHEADER"), 
  79.                                           TEXT ("BITMAPINFOHEADER"),
  80.                                           TEXT ("BITMAPV4HEADER"),
  81.                                           TEXT ("BITMAPV5HEADER") } ;
  82.      static TCHAR     * szCompression [] = { TEXT ("BI_RGB"), TEXT ("BI_RLE8"),
  83.                                              TEXT ("BI_RLE4"),
  84.                                              TEXT ("BI_BITFIELDS"),
  85.                                              TEXT ("unknown") } ;
  86.      BITMAPCOREHEADER * pbmch ;
  87.      BITMAPFILEHEADER * pbmfh ;
  88.      BITMAPV5HEADER   * pbmih ;
  89.      BOOL               bSuccess ;
  90.      DWORD              dwFileSize, dwHighSize, dwBytesRead ;
  91.      HANDLE             hFile ;
  92.      int                i ;
  93.      PBYTE              pFile ;
  94.      TCHAR            * szV ;
  95.  
  96.           // Display the file name
  97.  
  98.      Printf (hwnd, TEXT ("File: %s\r\n\r\n"), szFileName) ;
  99.  
  100.           // Open the file
  101.  
  102.      hFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
  103.                          OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;
  104.  
  105.      if (hFile == INVALID_HANDLE_VALUE)
  106.      {
  107.           Printf (hwnd, TEXT ("Cannot open file.\r\n\r\n")) ;
  108.           return ;
  109.      }
  110.           
  111.           // Get the size of the file
  112.  
  113.      dwFileSize = GetFileSize (hFile, &dwHighSize) ;
  114.  
  115.      if (dwHighSize)
  116.      {
  117.           Printf (hwnd, TEXT ("Cannot deal with >4G files.\r\n\r\n")) ;
  118.           CloseHandle (hFile) ;
  119.           return ;
  120.      }
  121.  
  122.           // Allocate memory for the file
  123.  
  124.      pFile = malloc (dwFileSize) ;
  125.  
  126.      if (!pFile)
  127.      {
  128.           Printf (hwnd, TEXT ("Cannot allocate memory.\r\n\r\n")) ;
  129.           CloseHandle (hFile) ;
  130.           return ;
  131.      }
  132.  
  133.           // Read the file
  134.  
  135.      SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
  136.      ShowCursor (TRUE) ;
  137.  
  138.      bSuccess = ReadFile (hFile, pFile, dwFileSize, &dwBytesRead, NULL) ;
  139.  
  140.      ShowCursor (FALSE) ;
  141.      SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  142.  
  143.      if (!bSuccess || (dwBytesRead != dwFileSize))
  144.      {
  145.           Printf (hwnd, TEXT ("Could not read file.\r\n\r\n")) ;
  146.           CloseHandle (hFile) ;
  147.           free (pFile) ;
  148.           return ;
  149.      }
  150.  
  151.           // Close the file
  152.  
  153.      CloseHandle (hFile) ;
  154.  
  155.           // Display file size
  156.  
  157.      Printf (hwnd, TEXT ("File size = %u bytes\r\n\r\n"), dwFileSize) ;
  158.  
  159.           // Display BITMAPFILEHEADER structure
  160.  
  161.      pbmfh = (BITMAPFILEHEADER *) pFile ;
  162.  
  163.      Printf (hwnd, TEXT ("BITMAPFILEHEADER\r\n")) ;
  164.      Printf (hwnd, TEXT ("\t.bfType = 0x%X\r\n"), pbmfh->bfType) ;
  165.      Printf (hwnd, TEXT ("\t.bfSize = %u\r\n"), pbmfh->bfSize) ;
  166.      Printf (hwnd, TEXT ("\t.bfReserved1 = %u\r\n"), pbmfh->bfReserved1) ;
  167.      Printf (hwnd, TEXT ("\t.bfReserved2 = %u\r\n"), pbmfh->bfReserved2) ;
  168.      Printf (hwnd, TEXT ("\t.bfOffBits = %u\r\n\r\n"), pbmfh->bfOffBits) ;
  169.  
  170.           // Determine which information structure we have
  171.  
  172.      pbmih = (BITMAPV5HEADER *) (pFile + sizeof (BITMAPFILEHEADER)) ;
  173.  
  174.      switch (pbmih->bV5Size)
  175.      {
  176.      case sizeof (BITMAPCOREHEADER):  i = 0 ;                       break ;
  177.      case sizeof (BITMAPINFOHEADER):  i = 1 ;  szV = TEXT ("i")  ;  break ;
  178.      case sizeof (BITMAPV4HEADER):    i = 2 ;  szV = TEXT ("V4") ;  break ;
  179.      case sizeof (BITMAPV5HEADER):    i = 3 ;  szV = TEXT ("V5") ;  break ;
  180.      default:
  181.           Printf (hwnd, TEXT ("Unknown header size of %u.\r\n\r\n"), 
  182.                         pbmih->bV5Size) ;
  183.           free (pFile) ;
  184.           return ;
  185.      }
  186.  
  187.      Printf (hwnd, TEXT ("%s\r\n"), szInfoName[i]) ;
  188.  
  189.           // Display the BITMAPCOREHEADER fields
  190.  
  191.      if (pbmih->bV5Size == sizeof (BITMAPCOREHEADER))
  192.      {
  193.           pbmch = (BITMAPCOREHEADER *) pbmih ;
  194.  
  195.           Printf (hwnd, TEXT ("\t.bcSize = %u\r\n"), pbmch->bcSize) ;
  196.           Printf (hwnd, TEXT ("\t.bcWidth = %u\r\n"), pbmch->bcWidth) ;
  197.           Printf (hwnd, TEXT ("\t.bcHeight = %u\r\n"), pbmch->bcHeight) ;
  198.           Printf (hwnd, TEXT ("\t.bcPlanes = %u\r\n"), pbmch->bcPlanes) ;
  199.           Printf (hwnd, TEXT ("\t.bcBitCount = %u\r\n\r\n"), pbmch->bcBitCount);
  200.           free (pFile) ;
  201.           return ;
  202.      }
  203.  
  204.           // Display the BITMAPINFOHEADER fields
  205.  
  206.      Printf (hwnd, TEXT ("\t.b%sSize = %u\r\n"), szV, pbmih->bV5Size) ;
  207.      Printf (hwnd, TEXT ("\t.b%sWidth = %i\r\n"), szV, pbmih->bV5Width);
  208.      Printf (hwnd, TEXT ("\t.b%sHeight = %i\r\n"), szV, pbmih->bV5Height) ;
  209.      Printf (hwnd, TEXT ("\t.b%sPlanes = %u\r\n"), szV, pbmih->bV5Planes) ;
  210.      Printf (hwnd, TEXT ("\t.b%sBitCount = %u\r\n"), szV, pbmih->bV5BitCount) ;
  211.      Printf (hwnd, TEXT ("\t.b%sCompression = %s\r\n"), szV, 
  212.                    szCompression [min (4, pbmih->bV5Compression)]) ;
  213.  
  214.      Printf (hwnd, TEXT ("\t.b%sSizeImage = %u\r\n"), szV, pbmih->bV5SizeImage);
  215.      Printf (hwnd, TEXT ("\t.b%sXPelsPerMeter = %i\r\n"), szV, 
  216.                    pbmih->bV5XPelsPerMeter) ;
  217.      Printf (hwnd, TEXT ("\t.b%sYPelsPerMeter = %i\r\n"), szV, 
  218.                    pbmih->bV5YPelsPerMeter) ;
  219.      Printf (hwnd, TEXT ("\t.b%sClrUsed = %i\r\n"), szV, pbmih->bV5ClrUsed) ;
  220.      Printf (hwnd, TEXT ("\t.b%sClrImportant = %i\r\n\r\n"), szV, 
  221.                    pbmih->bV5ClrImportant) ;
  222.  
  223.      if (pbmih->bV5Size == sizeof (BITMAPINFOHEADER))
  224.      {
  225.           if (pbmih->bV5Compression == BI_BITFIELDS)
  226.           {
  227.                Printf (hwnd, TEXT ("Red Mask   = %08X\r\n"), 
  228.                              pbmih->bV5RedMask) ;
  229.                Printf (hwnd, TEXT ("Green Mask = %08X\r\n"), 
  230.                              pbmih->bV5GreenMask) ;
  231.                Printf (hwnd, TEXT ("Blue Mask  = %08X\r\n\r\n"), 
  232.                              pbmih->bV5BlueMask) ;
  233.           }
  234.           free (pFile) ;
  235.           return ;
  236.      }
  237.  
  238.           // Display additional BITMAPV4HEADER fields
  239.  
  240.      Printf (hwnd, TEXT ("\t.b%sRedMask   = %08X\r\n"), szV, 
  241.                    pbmih->bV5RedMask) ;
  242.      Printf (hwnd, TEXT ("\t.b%sGreenMask = %08X\r\n"), szV, 
  243.                    pbmih->bV5GreenMask) ;
  244.      Printf (hwnd, TEXT ("\t.b%sBlueMask  = %08X\r\n"), szV, 
  245.                    pbmih->bV5BlueMask) ;
  246.      Printf (hwnd, TEXT ("\t.b%sAlphaMask = %08X\r\n"), szV, 
  247.                    pbmih->bV5AlphaMask) ;
  248.      Printf (hwnd, TEXT ("\t.b%sCSType = %u\r\n"), szV, 
  249.                    pbmih->bV5CSType) ;
  250.      Printf (hwnd, TEXT ("\t.b%sEndpoints.ciexyzRed.ciexyzX   = %08X\r\n"), szV, 
  251.                    pbmih->bV5Endpoints.ciexyzRed.ciexyzX) ;
  252.      Printf (hwnd, TEXT ("\t.b%sEndpoints.ciexyzRed.ciexyzY   = %08X\r\n"), szV, 
  253.                    pbmih->bV5Endpoints.ciexyzRed.ciexyzY) ;
  254.      Printf (hwnd, TEXT ("\t.b%sEndpoints.ciexyzRed.ciexyzZ   = %08X\r\n"), szV, 
  255.                    pbmih->bV5Endpoints.ciexyzRed.ciexyzZ) ;
  256.      Printf (hwnd, TEXT ("\t.b%sEndpoints.ciexyzGreen.ciexyzX = %08X\r\n"), szV, 
  257.                    pbmih->bV5Endpoints.ciexyzGreen.ciexyzX) ;
  258.      Printf (hwnd, TEXT ("\t.b%sEndpoints.ciexyzGreen.ciexyzY = %08X\r\n"), szV, 
  259.                    pbmih->bV5Endpoints.ciexyzGreen.ciexyzY) ;
  260.      Printf (hwnd, TEXT ("\t.b%sEndpoints.ciexyzGreen.ciexyzZ = %08X\r\n"), szV, 
  261.                    pbmih->bV5Endpoints.ciexyzGreen.ciexyzZ) ;
  262.      Printf (hwnd, TEXT ("\t.b%sEndpoints.ciexyzBlue.ciexyzX  = %08X\r\n"), szV,
  263.                    pbmih->bV5Endpoints.ciexyzBlue.ciexyzX) ;
  264.      Printf (hwnd, TEXT ("\t.b%sEndpoints.ciexyzBlue.ciexyzY  = %08X\r\n"), szV, 
  265.                    pbmih->bV5Endpoints.ciexyzBlue.ciexyzY) ;
  266.      Printf (hwnd, TEXT ("\t.b%sEndpoints.ciexyzBlue.ciexyzZ  = %08X\r\n"), szV, 
  267.                    pbmih->bV5Endpoints.ciexyzBlue.ciexyzZ) ;
  268.      Printf (hwnd, TEXT ("\t.b%sGammaRed   = %08X\r\n"), szV, 
  269.                    pbmih->bV5GammaRed) ;
  270.      Printf (hwnd, TEXT ("\t.b%sGammaGreen = %08X\r\n"), szV, 
  271.                    pbmih->bV5GammaGreen) ;
  272.      Printf (hwnd, TEXT ("\t.b%sGammaBlue  = %08X\r\n\r\n"), szV, 
  273.                    pbmih->bV5GammaBlue) ;
  274.  
  275.      if (pbmih->bV5Size == sizeof (BITMAPV4HEADER))
  276.      {
  277.           free (pFile) ;
  278.           return ;
  279.      }
  280.  
  281.           // Display additional BITMAPV5HEADER fields
  282.  
  283.      Printf (hwnd, TEXT ("\t.b%sIntent = %u\r\n"), szV, pbmih->bV5Intent) ;
  284.      Printf (hwnd, TEXT ("\t.b%sProfileData = %u\r\n"), szV, 
  285.                    pbmih->bV5ProfileData) ;
  286.      Printf (hwnd, TEXT ("\t.b%sProfileSize = %u\r\n"), szV, 
  287.                    pbmih->bV5ProfileSize) ;
  288.      Printf (hwnd, TEXT ("\t.b%sReserved = %u\r\n\r\n"), szV, 
  289.                    pbmih->bV5Reserved) ;
  290.  
  291.      free (pFile) ;
  292.      return ;
  293. }
  294.  
  295. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  296. {
  297.      static HWND         hwndEdit ;
  298.      static OPENFILENAME ofn ;
  299.      static TCHAR        szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
  300.      static TCHAR        szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")
  301.                                       TEXT ("All Files (*.*)\0*.*\0\0") ;
  302.      
  303.      switch (message)
  304.      {
  305.      case WM_CREATE:
  306.           hwndEdit = CreateWindow (TEXT ("edit"), NULL,
  307.                          WS_CHILD | WS_VISIBLE | WS_BORDER | 
  308.                               WS_VSCROLL | WS_HSCROLL |
  309.                               ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY, 
  310.                          0, 0, 0, 0, hwnd, (HMENU) 1,
  311.                          ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
  312.  
  313.           ofn.lStructSize       = sizeof (OPENFILENAME) ;
  314.           ofn.hwndOwner         = hwnd ;
  315.           ofn.hInstance         = NULL ;
  316.           ofn.lpstrFilter       = szFilter ;
  317.           ofn.lpstrCustomFilter = NULL ;
  318.           ofn.nMaxCustFilter    = 0 ;
  319.           ofn.nFilterIndex      = 0 ;
  320.           ofn.lpstrFile         = szFileName ;
  321.           ofn.nMaxFile          = MAX_PATH ;
  322.           ofn.lpstrFileTitle    = szTitleName ;
  323.           ofn.nMaxFileTitle     = MAX_PATH ;
  324.           ofn.lpstrInitialDir   = NULL ;
  325.           ofn.lpstrTitle        = NULL ;
  326.           ofn.Flags             = 0 ;
  327.           ofn.nFileOffset       = 0 ;
  328.           ofn.nFileExtension    = 0 ;
  329.           ofn.lpstrDefExt       = TEXT ("bmp") ;
  330.           ofn.lCustData         = 0 ;
  331.           ofn.lpfnHook          = NULL ;
  332.           ofn.lpTemplateName    = NULL ;
  333.           return 0 ;
  334.  
  335.      case WM_SIZE:
  336.           MoveWindow (hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE) ;
  337.           return 0 ;
  338.  
  339.      case WM_COMMAND:
  340.           switch (LOWORD (wParam))
  341.           {
  342.           case IDM_FILE_OPEN:
  343.                if (GetOpenFileName (&ofn))
  344.                     DisplayDibHeaders (hwndEdit, szFileName) ;
  345.  
  346.                return 0 ;
  347.           }
  348.           break ;
  349.      
  350.      case WM_DESTROY:
  351.           PostQuitMessage (0) ;
  352.           return 0 ;
  353.      }
  354.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  355. }
  356.